2023/12/232225字符
函数
package main
import "fmt"
// 自执行函数
func main() {
num := sum(0.1, 0.2)
fmt.Println(num) //--> 0.3
test(1, "2", .1, .2, .3)
}
// 自定义函数,参数类型统一可写在后面
func sum(a, b float32) float32 {
return a + b
}
// 剩余参数
func test(a int, b string, nums ... float32) {
fmt.Println(a, b, nums) //--> 1 2 [0.1 0.2 0.3]
}
内存分析
与 JS 一致,原始值和引用值的区别
package main
import "fmt"
func main() {
num := 10
changeNum(num)
fmt.Println(num) //--> 10
arr := [4]int{ 1, 2, 3, 4 }
changeArr(arr)
fmt.Println(arr) //--> [1 2 3 4]
sli := make([]int, 3)
changeSli(sli)
fmt.Println(sli) //--> [10 0 0]
func () {
fmt.Println("立即执行函数")
}()
}
func changeNum(num int) {
num = 20
}
func changeArr(arr [4]int) {
arr[0] = 100
}
func changeSli(sli []int) {
sli[0] = 10
}
函数回调
package main
import "fmt"
func main() {
test(1, func () {
fmt.Println(2)
})
}
func test(num int, callback func()) {
fmt.Println(num)
callback()
}
return 多个返回值
package main
import "fmt"
func main() {
sum, product := calculate(2, 3)
fmt.Println(sum, product) //--> 5 6
}
// 方式1
func calculate(a, b int)(int, int){
sum := a + b
product := a * b
return sum, product
}
// 方式2
func calculate2(a, b int)(sum int, product int){
sum = a + b
product = a * b
return
}
闭包
package main
import "fmt"
func main() {
iter := createNum()
fmt.Println(iter())
fmt.Println(iter())
fmt.Println(iter())
}
func createNum() func()int {
i := 0
return func ()int {
i++
return i
}
}
defer
package main
import "fmt"
func main() {
fmt.Println(1)
defer test(2) // 延迟执行,像 JS 中的事件循环机制,开启了异步队列
fmt.Println(3)
}
func test(num int) {
fmt.Println(num)
}
方法
某个类型上的功能,需要指定接收者调用
package main
import "fmt"
func main() {
dog := Dog{
name: "小黑",
age: 2,
}
fmt.Println(dog.getName()) //--> 小黑
}
type Dog struct{
name string
age int
}
func (d Dog) getName()string {
return d.name
}